﻿using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using nmConnectionDatabase;

//INFO SACADA DE http://www.dotnetperls.com/namespace

namespace nmProductos
{
    // ************************************************************
    // --------------------- PRODUCTOS ---------------------- 
    // ************************************************************


    public class Productos
    {
        //Propiedades
        public char TipoProducto { get; set; }
        public string IDProducto { get; set; }
        public string Nombre { get; set; }
        public string Descripcion { get; set; }
        public string Fabricante { get; set; }
        public string Genero { get; set; }
        public string Clasificacion { get; set; }
        public string Portada { get; set; }
        public string FechaSalida { get; set; }
        public bool Activo { get; set; }


        //Metodos
        public void SetPropiedades(char TipoProducto, string IDProducto, string Nombre, string Descripcion, string Fabricante, string Genero, string Clasificacion, string FechaSalida, string Estado)
        {
            this.TipoProducto = TipoProducto;
            this.IDProducto = IDProducto;
            this.Nombre = Nombre;
            this.Descripcion = Descripcion;
            this.Fabricante = Fabricante;
            this.Genero = Genero;
            this.Clasificacion = Clasificacion;
            this.FechaSalida = FechaSalida;

            if (Estado == "Activo")
            {
                this.Activo = true;
            }
            else
            {
                this.Activo = false;
            }

        }


        public void CatchSQLException(SqlException ex)
        {
            StringBuilder errorMessages = new StringBuilder();
            for (int i = 0; i < ex.Errors.Count; i++)
            {
                errorMessages.Append("Index #" + i + "\n" +
                    "Message: " + ex.Errors[i].Message + "\n" +
                    "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                    "Source: " + ex.Errors[i].Source + "\n" +
                    "Procedure: " + ex.Errors[i].Procedure + "\n");
            }

            MessageBox.Show(errorMessages.ToString());
        }



        // ------------------------------------------------------------------------
        // ------- TODOS ESTOS METODOS------------------------------------------
        // ------- SON PARA DAR DE ALTA UN PRODUCTO --------------------------------
        // ------------------------------------------------------------------------


        //***************
        // *************

        // UPDATE DE PRODUCTOSCONSOLA POR DATASET

        //***************
        // *************




        //Para dar el Alta de un Producto, recibe el DataSet y la Ruta de conexion
        //Si hay cambios, llama al metodo private InsertProducto, si no hay Indica que no se ha añadido nada

        public void AltaProductos(DataSet ds, string Ruta)
        {
            if (ds.HasChanges(DataRowState.Added))
            {
                DataSet dsInsert = new DataSet();
                dsInsert = ds.GetChanges(DataRowState.Added);
                InsertProducto(dsInsert, Ruta);
            }

            else
            {
                MessageBox.Show("No se ha insertado ningun Producto");
            }
        }

        //Para Insertar los Productos en la DB, recibe el DataSet con los Rows a añadir
        //y arma los parametros para ejecutarlo en la DB. 
        private void InsertProducto(DataSet dsInsert, string Ruta)
        {

            try
            { //Ingresa al Try para ver si puede Insertar el Producto. 
                int FilasInsertadas = 0;

                foreach (DataRow fila in dsInsert.Tables[0].Rows)
                {
                    SqlCommand comando = new SqlCommand();
                    ArmarParametrosInsert(ref comando, fila);
                    int error = ExecSPProducto(Ruta, "spInsertProducto", comando);
                    if (error == 0)
                    {
                        FilasInsertadas++;
                    }
                }

                MessageBox.Show("Se Agregaron " + FilasInsertadas + " Productos Nuevos");
            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
            }

        }


        private void ArmarParametrosInsert(ref SqlCommand comando, DataRow fila)
        {
            //Primer Parametro

            SqlParameter SqlParametros = new SqlParameter();
            SqlParametros = comando.Parameters.Add("@TipoProducto", SqlDbType.Char, 1);
            SqlParametros.Value = fila["TipoProducto"];

            //Segundo Parametro

            if (fila["IDProducto"].ToString().Length < 4)
            {
                if (fila["IDProducto"].ToString().Length == 1)
                {
                    fila["IDProducto"] = "000" + fila["IDProducto"].ToString();
                }

                if (fila["IDProducto"].ToString().Length == 2)
                {
                    fila["IDProducto"] = "00" + fila["IDProducto"].ToString();
                }

                if (fila["IDProducto"].ToString().Length == 3)
                {
                    fila["IDProducto"] = "0" + fila["IDProducto"].ToString();
                }

            }

            SqlParametros = comando.Parameters.Add("@IDProducto", SqlDbType.NChar, 4);
            SqlParametros.Value = fila["IDProducto"];

            MessageBox.Show(fila["IDProducto"].ToString());

            // Tercer Parametro

            SqlParametros = comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 100);
            SqlParametros.Value = fila["Nombre"];

            // Cuarto Parametro
            SqlParametros = comando.Parameters.Add("@Descripcion", SqlDbType.NVarChar);
            SqlParametros.Value = fila["Descripcion"];

            //Quinto Parametro
            SqlParametros = comando.Parameters.Add("@Fabricante", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["Fabricante"];

            //Sexto Parametro
            SqlParametros = comando.Parameters.Add("@Genero", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["Genero"];

            //Septimo Parametro

            SqlParametros = comando.Parameters.Add("@Clasificacion", SqlDbType.NVarChar, 50);
            SqlParametros.Value = fila["Clasificacion"];

            //Octavo Parametro

            SqlParametros = comando.Parameters.Add("@Imagen", SqlDbType.NVarChar, 100);
            SqlParametros.Value = fila["Portada"];

            //Noveno Parametro

            SqlParametros = comando.Parameters.Add("@FechaSalida", SqlDbType.DateTime);
            SqlParametros.Value = fila["FechaSalida"];

            //Decimo Parametro

            SqlParametros = comando.Parameters.Add("@Activo", SqlDbType.Bit);
            SqlParametros.Value = fila["Activo"];

        }





        //Arma los Parametros de todas las variables y columnas para poder pasarlo a la DB
        private void ArmarParametrosInsert(ref SqlCommand comando, Productos Prod)
        {
            //Primer Parametro
            SqlParameter SqlParametros = new SqlParameter();
            SqlParametros = comando.Parameters.Add("@TipoProducto", SqlDbType.Char, 1);
            SqlParametros.Value = Prod.TipoProducto;

            //Segundo Parametro
            SqlParametros = comando.Parameters.Add("@IDProducto", SqlDbType.NChar,4);
            SqlParametros.Value = Prod.IDProducto;
            // Tercer Parametro
            SqlParametros = comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 100);
            SqlParametros.Value = Prod.Nombre;
            // Cuarto Parametro
            SqlParametros = comando.Parameters.Add("@Descripcion", SqlDbType.Text);
            SqlParametros.Value = Prod.Descripcion;
            //Quinto Parametro
            SqlParametros = comando.Parameters.Add("@Fabricante", SqlDbType.NVarChar, 50);
            SqlParametros.Value = Prod.Fabricante;
            //Sexto Parametro
            SqlParametros = comando.Parameters.Add("@Genero", SqlDbType.NVarChar, 50);
            SqlParametros.Value = Prod.Genero;
            //Septimo Parametro
            SqlParametros = comando.Parameters.Add("@Clasificacion", SqlDbType.NVarChar, 50);
            SqlParametros.Value = Prod.Clasificacion;
            //Octavo Parametro
            SqlParametros = comando.Parameters.Add("@Imagen", SqlDbType.NVarChar,100);
            SqlParametros.Value = DBNull.Value;
            //Noveno Parametro
            SqlParametros = comando.Parameters.Add("@FechaSalida", SqlDbType.DateTime);

            if (Prod.FechaSalida.Trim() == "/  /")
            {
                SqlParametros.Value = DBNull.Value;
            }

            else
            {
                SqlParametros.Value = Prod.FechaSalida;
            }

            SqlParametros = comando.Parameters.Add("@Activo", SqlDbType.Bit);
            SqlParametros.Value = Prod.Activo;


        }



        public void AltaProductos(string RutaDB, Productos Prod)
        {
            try
            {
                SqlCommand comando = new SqlCommand();
                ArmarParametrosInsert(ref comando, Prod);
                int error = ExecSPProducto(RutaDB, "spInsertProducto", comando);

                if (error == 0)
                {
                    MessageBox.Show("Agregado Correctamente");
                }

                else
                {
                    MessageBox.Show("Error al Agregar - No se pudo agregar el Producto - Vuelva a Intentarlo");
                }
            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
            }

        }

        //Ejecuta el SPInsertProducto de la DB
        private int ExecSPProducto(String RutaBD, String NombreSP, SqlCommand Comando)
        {
            try
            {
                SqlConnection Conexion = new SqlConnection(RutaBD);
                Conexion.Open();
                SqlCommand cmd = new SqlCommand();
                cmd = Comando;
                cmd.Connection = Conexion;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = NombreSP;
                cmd.ExecuteNonQuery();
                Conexion.Close();
                return 0;
            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
                return 1;
            }
        }


        // ------------------------------------------------------------------------
        // ------------------------------------------------------------------------
        // ------------------ESTOS METODOS DE PRODUCTO-----------------------------------
        // -----------------SON PARA ELIMINAR PRODUCTOS----------------------------
        // ------------------------------------------------------------------------
        // ------------------------------------------------------------------------

        public void BajaProductos(string Ruta, char TipoProducto, string IDProducto)
        {
            try
            {
                int error = 0;
                SqlCommand comando = new SqlCommand();
                ArmarParametrosDelete(ref comando, TipoProducto, IDProducto);
                error = ExecSPProducto(Ruta, "spDeleteProducto", comando);

                if (error == 0)
                {
                    MessageBox.Show("Producto Eliminado");
                }
                else
                {

                }

            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
            }

        }

        private void ArmarParametrosDelete(ref SqlCommand comando, char TipoProducto, string IDProducto)
        {
            SqlParameter SqlParametros = new SqlParameter();

            //Primer Parametro
            SqlParametros = comando.Parameters.Add("@TipoProducto", SqlDbType.Char, 1);
            SqlParametros.Value = TipoProducto;

            //Segundo Parametro
            SqlParametros = comando.Parameters.Add("@IDProducto", SqlDbType.NChar,4);
            SqlParametros.Value = IDProducto;
        }



        public void BajaProductos(DataSet ds, string Ruta)
        {

            if (ds.HasChanges(DataRowState.Deleted))
            {
                DataSet dsEliminar = new DataSet();
                dsEliminar = ds.GetChanges(DataRowState.Deleted);
                DeleteProductos(Ruta, "Productos", dsEliminar);
            }

        }

        private void DeleteProductos(String RutaBD, String NombreTabla, DataSet ds)
        {
            int FilasEliminadas = 0;
            foreach (DataRow fila in ds.Tables[NombreTabla].Rows)
            {
                SqlCommand Comando = new SqlCommand();
                fila.RejectChanges();
                ArmarParametrosDelete(ref Comando, fila);
                ExecSPProducto(RutaBD, "spDeleteProducto", Comando);
                FilasEliminadas++;
            }

            MessageBox.Show("Se eliminaron: " + FilasEliminadas + " productos");
        }

        private void ArmarParametrosDelete(ref SqlCommand comando, DataRow fila)
        {
            SqlParameter SqlParametros = new SqlParameter();

            //Primer Parametro
            SqlParametros = comando.Parameters.Add("@TipoProducto", SqlDbType.Char, 1);
            SqlParametros.Value = fila["TipoProducto"];

            //Segundo Parametro
            SqlParametros = comando.Parameters.Add("@IDProducto", SqlDbType.NChar,4);
            SqlParametros.Value = fila["IDProducto"];
        }

        // ------------------------------------------------------------------------
        // ------------------------------------------------------------------------
        // ------------------ESTOS METODOS DE PRODUCTO-----------------------------------
        // -----------------SON PARA UPDATE DE PRODUCTOS----------------------------
        // ------------------------------------------------------------------------
        // ------------------------------------------------------------------------

        public void ModificarProducto(DataSet ds, string Ruta)
        {
            if (ds.HasChanges(DataRowState.Modified))
            {
                DataSet dsUpdate = new DataSet();
                dsUpdate = ds.GetChanges(DataRowState.Modified);
                UpdateProducto(dsUpdate, Ruta);
            }
        }

        private void UpdateProducto(DataSet dsInsert, string Ruta)
        {

            try
            { //Ingresa al Try para ver si puede Insertar el Producto. 
                int FilasInsertadas = 0;

                foreach (DataRow fila in dsInsert.Tables[0].Rows)
                {
                    SqlCommand comando = new SqlCommand();
                    ArmarParametrosInsert(ref comando, fila);
                    int error = ExecSPProducto(Ruta, "spUpdateProducto", comando);

                    if (error == 0)
                    {
                        FilasInsertadas++;
                    }
                    MessageBox.Show("Se Modificaron " + FilasInsertadas + " Productos");
                }

            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
            }

        }

        public void ModificarProducto(string RutaDB, Productos Prod)
        {
            try
            {
                SqlCommand comando = new SqlCommand();
                ArmarParametrosInsert(ref comando, Prod);
                int error = ExecSPProducto(RutaDB, "spUpdateProducto", comando);
                if (error == 0)
                {
                    MessageBox.Show("Modificado Correctamente");
                }

            }

            catch (SqlException ex)
            {
                CatchSQLException(ex);
                MessageBox.Show("Error al Insertar");

            }

        }



    }


}